﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zhaoxi.S7Lib
{
    /// <summary>
    /// 数据类型枚举
    /// </summary>
    public enum Areas
    {
        /// <summary>
        /// 输入映像区 
        /// ‌功能‌：存储PLC输入端子的实时状态（如传感器、按钮信号）‌
        /// 只读区域，每个扫描周期自动刷新硬件输入值‌
        /// 地址格式：I0.0（位）、IB0（字节）、IW2（字）
        /// </summary>
        I = 0x81,
        /// <summary>
        /// 输出映像区
        /// 功能‌：控制输出端子连接的设备（如电机、指示灯）
        /// 可读可写，程序结束后自动写入硬件‌
        /// 地址格式：Q0.0、QB0、QW2
        /// </summary>
        Q = 0x82,
        /// <summary>
        /// 数据块
        /// 功能‌：存储复杂数据（配方、参数、历史记录）
        /// 支持结构化数据类型（数组、结构体）。
        /// 可配置掉电保持，适合关键数据
        /// 地址格式：DB1.DBX0.0、DB1.DBW2。
        /// </summary>
        DB = 0x84,
        /// <summary>
        /// 变量存储器
        /// ‌功能‌：用户自定义变量存储（如S7-200系列）
        /// 类似M区，但部分型号支持掉电保持配置。
        /// 与DB块相比，灵活性较低（如不支持结构化数据）
        /// </summary>
        V = 0x84,
        /// <summary>
        /// 内部标志位区
        /// 功能‌：存储中间变量、临时标志位（如程序状态、计数器）‌
        /// 掉电数据丢失，适合临时存储。
        /// 地址格式：M0.0、MB0、MW2
        /// </summary>
        M = 0x83
    }

    /// <summary>
    /// 发送数据类型枚举
    /// </summary>
    public enum ParameterVarType
    {
        /// <summary>
        /// 位 1位（0或1），用于单个开关量信号‌
        /// </summary>
        BIT = 0x01,
        /// <summary>
        /// 字节 8位（1字节），范围0~255（无符号）‌
        /// </summary>
        BYTE = 0x02,
        /// <summary>
        /// 字符
        /// 固定占用 ‌1 字节（8 位）‌‌
        /// 范围：有符号时为 -128 到 127，无符号时为 0 到 255‌
        /// 存储字符时使用 ASCII 编码（标准范围 0~127）。
        /// </summary>
        CHAR = 0x03,
        /// <summary>
        /// 字符串
        /// 存储大小‌：2字节（16位）‌
        /// 数值范围‌：0 至 65535（无符号）‌。
        /// </summary>
        WORD = 0x04,
        /// <summary>
        /// 整数
        /// 存储大小‌：2字节（16位）‌
        /// 数值范围‌：0 至 65535（无符号）‌
        /// </summary>
        INT = 0x05,
        /// <summary>
        /// 字符串
        /// ‌存储大小‌：4字节（32位）‌
        /// 数值范围‌：0 至 4,294,967,295（无符号）‌
        /// </summary>
        DWORD = 0x06,
        /// <summary>
        /// 整数 32位（4字节），范围-2147483648~+2147483647‌
        /// </summary>
        DINT = 0x07,
        /// <summary>
        /// 浮点数
        /// 存储大小‌：4字节（32位）‌
        /// 存储范围‌：-3.402823466E+38 至 3.402823466E+38（有符号）‌
        /// </summary>
        REAL = 0x08,
        /// <summary>
        /// 时间 通常占用32位
        /// </summary>
        DATE = 0x09
    }

    /// <summary>
    /// 返回数据类型枚举
    /// </summary>
    public enum DataVarType
    {
        /// <summary>
        /// 无
        /// </summary>
        NULL = 0x00,
        /// <summary>
        /// 位 1位（0或1），用于单个开关量信号‌
        /// </summary>
        BIT = 0x03,
        /// <summary>
        /// 字节 8位（1字节），范围0~255（无符号）‌
        /// </summary>
        BYTE = 0x04,
        /// <summary>
        /// 16位（2字节），范围0~65535（无符号）‌
        /// </summary>
        WORD = 0x04,
        /// <summary>
        /// 32位（4字节），范围0~4294967295（无符号）‌
        /// </summary>
        DWORD = 0x04,
        /// <summary>
        /// 整数 16位（2字节），范围-32768~+32767‌
        /// </summary>
        INTERGER = 0x05,
        /// <summary>
        /// 浮点数
        /// 存储大小‌：4字节（32位）‌
        /// 存储范围‌：-3.402823466E+38 至 3.402823466E+38（有符号）‌
        /// </summary>
        REAL = 0x07,
        /// <summary>
        /// 字符串 可变长度，通常以长度前缀+字符数组存储（如西门子PLC中前2字节表示长度）‌
        /// </summary>
        OCTETSTRING = 0x09
    }
}
